package gestores;

import java.io.IOException;
import java.util.Hashtable;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import sistema.Aposta;
import sistema.Jogo;
import sistema.Resultado;
import sistema.Utilizador;

public class GestorApostas extends HttpServlet {

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        String accao = request.getParameter("accao");

        if (accao.equals(GestorApostas.HISTORICO)) {
            try {
                visualizaApostas(request, response, session);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (accao.equals(GestorApostas.RESULTADOS)) {
            try {
                mostraResultados(request, response, session);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (accao.equals(GestorApostas.INSERIR)) {
            try {
                inserirAposta(request, response, session);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    public void inserirAposta(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {

        if (request.getParameter("cancelaraposta")!= null  && request.getParameter("cancelaraposta").equals("cancelar")) {
            session.removeAttribute("escolhas");
            response.sendRedirect("/Projecto_PR/index.jsp");

        } else if (request.getParameter("inseriraposta") !=null && request.getParameter("inseriraposta").equals("validar")) {
            Integer num_escolhas = Integer.parseInt((String) request.getParameter("nr_escolhas"));
            Long id_ut = ((Utilizador) session.getAttribute("utilizador")).getId_utilizador();
            if (num_escolhas > 0) {
                List<Escolha> escolhas = (List<Escolha>) session.getAttribute("escolhas");
                int i = 1;
                for (Escolha e : escolhas) {
                    Double stake = Double.parseDouble(request.getParameter("valor" + i));

                    Hashtable<String, String> dados_ap = new Hashtable<String, String>();
                    dados_ap.put("var_escolha", e.getEscolha());
                    dados_ap.put("var_odd", e.getOdd().toString());
                    dados_ap.put("var_stake", stake.toString());
                    dados_ap.put("var_estado", "activa");
                    dados_ap.put("var_idevento", e.getId_evento().toString());
                    dados_ap.put("var_idutilizador", id_ut.toString());
                    try {
                        Double saldo = Utilizador.devolveSaldo(id_ut);
                        if (saldo >= stake) {
                            Aposta.insereAposta(dados_ap);

                            Double total = saldo - stake;
                            Hashtable<String, String> dados_actualizar = new Hashtable<String, String>();
                            dados_actualizar.put("var_saldo", total.toString());
                            dados_actualizar.put("var_idutilizador", id_ut.toString());

                            Utilizador.actualizaSaldo(dados_actualizar);

                        } else {
                            //DEVOLVE ERRO AO UTILIZADOR pq o saldo para a operção é insuficiente
                            session.setAttribute("excepcao", "O seu saldo não é suficiente para executar esta acção!");
                            response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                         session.setAttribute("excepcao", "Não foi possível executar esta acção. Tente novamente!");
                        response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
                    }
                    i++;
                }
                session.removeAttribute("escolhas");
                session.removeAttribute("utilizador");
                try {
                    session.setAttribute("utilizador", Utilizador.devolvePorId(id_ut));
                } catch (Exception ex) {
                    ex.printStackTrace();
                    session.setAttribute("excepcao", "Não foi possível executar esta acção. Tente novamente!");
                    response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
                }
                response.sendRedirect("/Projecto_PR/mostra_sucesso.jsp");
            }
        } else {
            //ERRO!!!!!!!!!!! pq nao tem accao associada
            IllegalArgumentException illegal_argument_exception = new IllegalArgumentException();
            session.setAttribute("excepcao", illegal_argument_exception.toString());
            response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
        }
    }

    //visualiza todas as apostas, pelo seu estado
    public void visualizaApostas(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {

        String sub_accao = request.getParameter("subaccao");
        Long id = ((Utilizador) session.getAttribute("utilizador")).getId_utilizador();
        List<Aposta> lista_apostas = null;
        session.removeAttribute("lista_apostas");

        if (sub_accao != null && sub_accao.equals("todas")) {
            try {
                lista_apostas = Aposta.devolveTodasApostas(id);
            } catch (Exception ex) {
                ex.printStackTrace();
                session.setAttribute("excepcao", "Não foi possível executar esta acção. Tente novamente!");
                response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
            }
        } else if (sub_accao != null && !sub_accao.equals("todas")) {
            try {
                lista_apostas = Aposta.devolveAposta(id, sub_accao);
            } catch (Exception ex) {
                ex.printStackTrace();
                session.setAttribute("excepcao", "Não foi possível executar esta acção. Tente novamente!");
                response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
            }
        } else {
            //ERRO!!!!!!!!!!! pq nao tem accao associada
            IllegalArgumentException illegal_argument_exception = new IllegalArgumentException();
            session.setAttribute("excepcao", illegal_argument_exception.toString());
            response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
        }
        session.setAttribute("lista_apostas", lista_apostas);
        response.sendRedirect("/Projecto_PR/historico_apostas.jsp");
    }

    public void mostraResultados(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {

        String sub_accao = request.getParameter("subaccao");
        List<Jogo> lista_jogos = null;
        session.removeAttribute("lista_resultados");

        if (sub_accao != null && sub_accao.equals("ultimos")) {
            try {
                List<Resultado> lista_resultados = Resultado.devolveUltimos();
                lista_jogos = Jogo.criaListaJogos(lista_resultados);
            } catch (Exception ex) {
                ex.printStackTrace();
                session.setAttribute("excepcao", "Não foi possível executar esta acção. Tente novamente!");
                response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
            }
        } else if (sub_accao != null && sub_accao.equals("futebol")) {
            try {
                List<Resultado> lista_resultados = Resultado.devolveFutebol();
                lista_jogos = Jogo.criaListaJogos(lista_resultados);
            } catch (Exception ex) {
                ex.printStackTrace();
                session.setAttribute("excepcao", "Não foi possível executar esta acção. Tente novamente!");
                response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
            }
        } else if (sub_accao != null && sub_accao.equals("tenis")) {
            try {
                List<Resultado> lista_resultados = Resultado.devolveTenis();
                lista_jogos = Jogo.criaListaJogos(lista_resultados);
            } catch (Exception ex) {
                ex.printStackTrace();
                session.setAttribute("excepcao", "Não foi possível executar esta acção. Tente novamente!");
                response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
            }
        } else {
            //ERRO!!!!!!!!!!! pq nao tem accao associada
            IllegalArgumentException illegal_argument_exception = new IllegalArgumentException();
            session.setAttribute("excepcao", illegal_argument_exception.toString());
            response.sendRedirect("/Projecto_PR/mostra_erro.jsp");
        }
        session.setAttribute("lista_resultados", lista_jogos);
        response.sendRedirect("/Projecto_PR/ver_resultado.jsp");
    }
    public static final String HISTORICO = "ver_apostas";
    public static final String RESULTADOS = "ver_resultados";
    public static final String INSERIR = "inserir_aposta";
}
